package main.java;

import org.junit.Test;

import java.io.File;
import java.io.IOException;

/**
 * @auther yangdong
 * @create 2020-04-13
 * java中的相对路径不是相对于目标自己所在的路径，而是相对于目标所在工程所在的路径
 */
public class FileTest {
    /**
     *  java.io.File类：文件和文件目录路径的抽象表示形式，与平台无关
     *  File 能新建、删除、重命名文件和目录，但 File 不能访问文件内容本身。
     * 如果需要访问文件内容本身，则需要使用输入/输出流。
     *  想要在Java程序中表示一个真实存在的文件或目录，那么必须有一个File对
     * 象，但是Java程序中的一个File对象，可能没有一个真实存在的文件或目录。
     *  File对象可以作为参数传递给流的构造器
     *  public File(String pathname)
     * 以pathname为路径创建File对象，可以是绝对路径或者相对路径，如果
     * pathname是相对路径，则默认的当前路径在系统属性user.dir中存储。
     *  绝对路径：是一个固定的路径,从盘符开始
     *  相对路径：是相对于某个位置开始
     *  public File(String parent,String child)
     * 以parent为父路径，child为子路径创建File对象。
     *  public File(File parent,String child)
     * 根据一个父File对象和子文件路径创建File对象
     *  路径中的每级目录之间用一个路径分隔符隔开。
     *  路径分隔符和系统有关：
     *  windows和DOS系统默认使用“\”来表示
     *  UNIX和URL使用“/”来表示
     *  Java程序支持跨平台运行，因此路径分隔符要慎用。
     *  为了解决这个隐患，File类提供了一个常量：
     * public static final String separator。根据操作系统，动态的提供分隔符。
     */
    @Test
    public void testFile(){
        File file=new File("a.txt");//就是javathread下的一个文件
        System.out.println(file);
        File file1=new File("dictory/b.txt");
        System.out.println(file1);
        File file2=new File("D:\\IdeaProjects\\javaAPI\\javathread\\src\\main\\java\\java_IO\\dictory1\\c.txt");
        System.out.println(file2);
        File file3=new File("D:\\IdeaProjects\\javaAPI\\javathread\\src\\main\\java\\java_IO","dictory2");
        System.out.println(file3);
        File file4=new File(file3,"d.txt");
        System.out.println(file4);
    }
    /**
     *  File类的获取功能
     *  public String getAbsolutePath()：获取绝对路径
     *  public String getPath() ：获取路径
     *  public String getName() ：获取名称
     *  public String getParent()：获取上层文件目录路径。若无，返回null
     *  public long length() ：获取文件长度（即：字节数）。不能获取目录的长度。
     *  public long lastModified() ：获取最后一次的修改时间，毫秒值
     *  public String[] list() ：获取指定目录下的所有文件或者文件目录的名称数组
     *  public File[] listFiles() ：获取指定目录下的所有文件或者文件目录的File数组
     *  File类的重命名功能
     *  public boolean renameTo(File dest):把文件重命名为指定的文件路径,相当于剪切，目标文件不能存在，路径必须是绝对路径
     *  File类的判断功能
     *  public boolean isDirectory()：判断是否是文件目录
     *  public boolean isFile() ：判断是否是文件
     *  public boolean exists() ：判断是否存在
     *  public boolean canRead() ：判断是否可读
     *  public boolean canWrite() ：判断是否可写
     *  public boolean isHidden() ：判断是否隐藏
     */
    @Test
    public void TestFileMethod(){
        File file=new File("D:\\IdeaProjects\\javaAPI\\javathread\\src\\main\\java\\java_IO");
        for(String name:file.list()){
            System.out.println(name);
        }
        for(File name:file.listFiles()){
            System.out.println(name);
        }
        File file1=new File("D:\\IdeaProjects\\javaAPI\\javathread\\src\\main\\java\\java_IO\\hello.txt");
        File file2=new File("D:\\IdeaProjects\\javaAPI\\javathread\\src\\main\\java\\java_IO\\dictory\\hi.txt");
        boolean b = file1.renameTo(file2);
        System.out.println(b);
        System.out.println(file2.exists());
        System.out.println(file2.isDirectory());
        System.out.println(file2.isFile());

    }
    /**
     *  File类的创建功能
     *  public boolean createNewFile() ：创建文件。若文件存在，则不创建，返回false
     *  public boolean mkdir() ：创建文件目录。如果此文件目录存在，就不创建了。
     * 如果此文件目录的上层目录不存在，也不创建。
     *  public boolean mkdirs() ：创建文件目录。如果上层文件目录不存在，一并创建
     * 注意事项：如果你创建文件或者文件目录没有写盘符路径，那么，默认在项目
     * 路径下。
     *  File类的删除功能
     *  public boolean delete()：删除文件或者文件夹
     * 删除注意事项：
     * Java中的删除不走回收站。
     * 要删除一个文件目录，请注意该文件目录内不能包含文件或者文件目录
     */
    @Test
    public void testMakeAndDelete() throws IOException {
        File file=new File("D:\\IdeaProjects\\javaAPI\\javathread\\src\\main\\java\\java_IO\\hello.txt");
        if(!file.exists()){
            file.createNewFile();
        }else{
            file.delete();
        }
        System.out.println(file.getAbsolutePath());
        File file1=new File("D:\\IdeaProjects\\javaAPI\\javathread\\src\\main\\java\\java_IO\\dictory");
        if (file1.exists()) {
            file1.delete();
        }else{
            file1.mkdirs();
        }
        System.out.println(file1.getAbsolutePath());
    }
}
